package tron.oauth;

import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import tron.oauth.config.*;

import javax.servlet.FilterChain;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Collection;

public interface LookMe {

    /**
     * {@link UsernamePasswordAuthenticationFilter 自行看源码不过多解释}
     * 为什么登录请求默认是/login POST请求 以及登录参数的约束 username 和 password
     */

    /**
     * {@link CustomerLoginFilter#attemptAuthentication(HttpServletRequest, HttpServletResponse)}
     * 接收到登录数据后有一个预留的登录参数处理方法，可以变通解决一些如ca登录的情况
     */

    /**
     * {@link MyUserDetailsService#loadUserByUsername(String)}
     * 后台准备用来校验的用户
     */


    /**
     * {@link DaoAuthenticationProvider#additionalAuthenticationChecks(UserDetails, UsernamePasswordAuthenticationToken) 自行看源码}
     * 验证逻辑
     */


    /**
     * {@link CustomerLoginFilter#successfulAuthentication(HttpServletRequest, HttpServletResponse, FilterChain, Authentication)}
     * 登录成功以后，生成token，用户信息(基本信息，权限信息) 写缓存，设置密码过期时间等操作
     */

    /**
     * {@link CustomerLoginFilter#unsuccessfulAuthentication(HttpServletRequest, HttpServletResponse, AuthenticationException)}
     * 登录失败，失败次数限制，密码锁定等处理
     */


    /**
     * {@link CustomerFilterInvocationSecurityMetadataSource#getAttributes(Object) }
     * 资源权限校验第一步，获取访问当前资源所需角色
     */

    /**
     * {@link CustomerAccessDecisionManger#decide(Authentication, Object, Collection)}
     * 资源权限校验第二步，根据token，验证当前用户是否拥有上一步返回的角色列表中的角色
     */

    /**
     * {@link RootService}
     * 登录以及权限校验的核心工具类
     */

    /**
     * {@link MySecurityConfig}
     * 整合登录，认证相关功能的配置类
     */

    /**
     * {@url /error}
     * {@link org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController#error [1 args]}
     */

    /**
     * {@url /tron/test}
     * {@link tron.oauth.controller.TronController#test [2 args]}
     */

}
